package com.kgc.est.service.impl;

import com.alibaba.fastjson.JSON;
import com.kgc.est.constants.Constants;
import com.kgc.est.dto.BrandDto;
import com.kgc.est.dto.ClassfyDto;
import com.kgc.est.dto.ModelDto;
import com.kgc.est.mapper.BrandMapper;
import com.kgc.est.mapper.ClassifyMapper;
import com.kgc.est.mapper.ModelMapper;
import com.kgc.est.utils.Result;
import com.kgc.est.utils.ResultUtils;
import com.kgc.est.utils.redis.RedisKeyUtils;
import com.kgc.est.utils.redis.RedisUtils;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping("/classify")
public class ClassifyServiceImpl {

    Logger log = LoggerFactory.getLogger(ClassifyServiceImpl.class);

    @Autowired(required = false)
    private ClassifyMapper classifyMapper;

    @Autowired(required = false)
    private BrandMapper brandMapper;

    @Autowired(required = false)
    private ModelMapper modelMapper;

    @Autowired
    private RedisUtils redisUtils;


    /**
     * 加载类别树的实现流程
     *      1.查询出所有的商品类别
     *      2.遍历类别，然后根据类别id，查询出这个类别下面的所有品牌
     *      3.遍历品牌，然后根据品牌id和类别id，查询出符合条件的所有的商品类型
     * @return
     */
    @GetMapping("/tree")
    public Result getClassifyTree(){

        //1.从redis中读取商品类别树信息
        String value = redisUtils.getValue(Constants.Redis.KEY_HOME_TREE);

        log.info("从redis中取得的类别树：{}",value);


        List<ClassfyDto> classifyDtos = null;
        //判断calue的值是否为null
        if (StringUtils.isBlank(value)){
            //如果为null
            //查询所有的商品类别
             classifyDtos = classifyMapper.selectClassifys();

            //遍历商品类别
            for (ClassfyDto classfyDto : classifyDtos) {
                Long classfyId = classfyDto.getId();
                //根据商品类型id查询包含的所有品牌信息
                List<BrandDto> brandDtos = brandMapper.selectBrandByClassifyId(classfyId);

                //遍历品牌信息
                for (BrandDto brandDto : brandDtos) {
                    //拿到当前品牌的id
                    Long brandId = brandDto.getId();

                    //根据商品类别id和品牌id查询包含的所有商品类型信息
                    List<ModelDto> modelDtos = modelMapper.selectModelByClassifyIdAndBrandId(classfyId, brandId);

                    //把这个符合条件的商品类型保存到对应的品牌中
                    brandDto.setModelList(modelDtos);
                }

                //保存品牌信息到当前的商品类别中
                classfyDto.setBrandList(brandDtos);

                //保存数据到redis中
                redisUtils.putValue(Constants.Redis.KEY_HOME_TREE,JSON.toJSONString(classifyDtos));
            }
        }else {
            //如果不为null
            classifyDtos = JSON.parseObject(value, List.class);
        }
        log.info("类别树对象：{}",classifyDtos);
        return ResultUtils.returnDataSuccess(classifyDtos);
    }

}
